// 现代 JavaScript 数据类型和模板字符串
// 作者：AI助手
// 最后更新：2024年

/**
 * JavaScript 的数据类型
 * 1. 基本类型：string, number, boolean, null, undefined, symbol, bigint
 * 2. 引用类型：object, array, function
 */

// 1. 基本数据类型
const name = '张三';               // string
const age = 25;                   // number
const isStudent = true;           // boolean
const nothing = null;             // null
let undefined_var;                // undefined
const uniqueId = Symbol('id');    // symbol
const bigNumber = 9007199254740991n; // bigint

// 2. 模板字符串
const greeting = `你好，${name}！
你的年龄是 ${age} 岁。
${isStudent ? '你是学生。' : '你不是学生。'}`;

console.log(greeting);

// 3. 标签模板字符串
function highlight(strings, ...values) {
    let result = '';
    strings.forEach((str, i) => {
        result += str;
        if (i < values.length) {
            result += `<span class="highlight">${values[i]}</span>`;
        }
    });
    return result;
}

const title = '现代 JavaScript';
const desc = '很棒';
const html = highlight`我正在学习${title}，它真的${desc}！`;
console.log(html);

// 4. 数组和对象的现代用法
// 4.1 数组解构
const numbers = [1, 2, 3, 4, 5];
const [first, second, ...rest] = numbers;
console.log(first, second, rest); // 1, 2, [3, 4, 5]

// 4.2 对象解构
const person = {
    fullName: '李四',
    age: 30,
    city: '北京',
    address: {
        street: '长安街',
        number: '100号'
    }
};

const { fullName, city, address: { street } } = person;
console.log(`${fullName}住在${city}的${street}`);

// 5. 类型检查
function checkType(value) {
    console.log(`${value} 的类型是: ${typeof value}`);
}

checkType(42);          // number
checkType('Hello');     // string
checkType(true);        // boolean
checkType(undefined);   // undefined
checkType(null);        // object (这是JS的一个历史遗留bug)
checkType({});          // object
checkType([]);          // object
checkType(() => {});    // function

// 6. 实际应用示例
function formatUserData(user) {
    // 使用默认值和解构
    const {
        name = '匿名用户',
        age = 0,
        contacts = {
            email: '',
            phone: ''
        }
    } = user;

    // 使用模板字符串生成格式化输出
    return `
用户信息：
-----------------
姓名: ${name}
年龄: ${age}
联系方式:
    邮箱: ${contacts.email || '未提供'}
    电话: ${contacts.phone || '未提供'}
-----------------
    `.trim();
}

// 测试数据
const userData = {
    name: '王五',
    age: 28,
    contacts: {
        email: 'wangwu@example.com',
        phone: '123-4567-8900'
    }
};

console.log(formatUserData(userData)); 